function spt2DData=loadSWANPoints(fName)
% This file is part of CISNE.
%
%     CISNE is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     any later version.
%
%     CISNE is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%     GNU General Public License for more details.
%
%     You should have received a copy of the GNU General Public License
%     along with CISNE.  If not, see <http://www.gnu.org/licenses/>.

% Copyright 2011. Jose Maria Garcia-Valdecasas Bernal
%
%loadSWANPoints(fname) carga la distribucion direccional del espectro
%energetico de salida de los puntos de control de SWAN
%basado en un codigo original de Alexandru Sheremet, (Mayo 2001)
% Jose Maria Garcia-Valdecasas Bernal
%la estructura de salida tiene la siguiente forma
%           1: discretizacion de frecuencias
%           2: discretizacion de direcciones
%           3: coordenadas (x,y) de los puntos
%           4: cell-array, cada celda contiene el espectro para cada punto

spt2DData=[];

fid=fopen(fName,'r');
%nos saltamos las 3 primeras lineas (morralla)
fgetl(fid); fgetl(fid); fgetl(fid);

%LOCATIONS (no me interesa)
fgetl(fid); 

% coordenadas de los puntos de control en las coordenadas del problema
fline=fgetl(fid);
elem=regexp(fline, '\s+', 'split');
Np=sscanf(elem{2},'%i');

x=zeros(Np,1); y=zeros(Np,1);
for kp=1:Np
    fline=fgetl(fid);
    elem=regexp(fline, '\s+', 'split');
    xx=sscanf(elem{2},'%f');
    yy=sscanf(elem{3},'%f');
    x(kp)=xx;
    y(kp)=yy;
end

% Informacion de la frecuenca: AFREQ/RFREQ-----------------------------
fgetl(fid);
%vector de frecuencias
fline=fgetl(fid);
elem=regexp(fline, '\s+', 'split');
Nf=sscanf(elem{2},'%i');
f=zeros(Nf,1);
for kp=1:Nf
    fline=fgetl(fid);
    f(kp)=str2double(fline);
end

% Informacion de las direcciones CDIR/NDIR ---------------------------
fgetl(fid);
% vector direccional
fline=fgetl(fid);
elem=regexp(fline, '\s+', 'split');
Nt=sscanf(elem{2},'%i');

th=zeros(Nt,1);
for kp=1:Nt
    fline=fgetl(fid);
    th(kp)=str2double(fline);
end

% basurilla...
fgetl(fid);
fgetl(fid); 

%Variance Densities
fgetl(fid); 
% unidades: (m^2*s/deg)
fgetl(fid);
% valor de "error": (
exv=fgetl(fid); exv=str2double(strtok(exv));

%almacenamos los datos de frecuencia, direccion y puntos de control
spt2DData{1}=f;
spt2DData{2}=[th;th(1)];
spt2DData{3}=[x(:),y(:)];
spt2DData{4}=cell(1,Np);

% Np espectros de energia
%kt=0;
%time... always 1 (in our stational cases)
J=[];
while (~feof(fid)) %por si lso datos estan corruptos y se llega al final antes
    %bucle para leer todos los puntos
    
    for kp=1:Np
        fline=fgetl(fid);
        spt=zeros(Nf,Nt+1);
        % this line can be 'FACTOR' or 'NODATA'
        if strmatch(fline,'FACTOR');
            % if FACTOR then read the spectrum.
            factor=str2double(fgetl(fid));
            spt(:,1:end-1)=fscanf(fid,'%f',[Nt,Nf])'*factor;
            % fill in the circle
            spt(:,end)=spt(:,1);
            spt2DData{4}{kp}=spt; %#ok<AGROW>
            % there's a remainder fron fscanf to be flushed out:
            fgetl(fid);
        elseif strmatch(fline,'NODATA');
            disp(['point: ', num2str(kp),' invalid.']);
            J=[J,kp];
        end

    end  
    
end
% delete the bad points
spt2DData{3}(J,:)=[];
spt2DData{4}(J)=[];
fclose(fid);
